// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause*;

// import java.util.ArrayList;
// import java.util.std::list;
#pragma once
#include <string>
#include <list>
#include "../SQLStatementImpl.h"
#include "../SQLReplaceable.h"

class SQLAssignItem;
class SQLExprTableSource;
class SQLSelect;
class SQLInsertStatement;
class SQLInsertStatement_ValuesClause;
class SQLCommentHint;
class SQLName;
class SQLSelectQuery;
class SQLExpr;

class SQLInsertInto : public SQLStatementImpl, public SQLReplaceable
{
public:
  string_list_ptr insertBeforeComments;

  SQLExprTableSource_ptr tableSource;
  SQLExpr_list_ptr columns;
  string_ptr columnsString;
  long columnsStringHash;
  SQLSelect_ptr query;
  SQLInsertStatement_ValuesClause_list_ptr valuesList;
  BOOL_ptr overwrite;
  SQLAssignItem_list_ptr partitions;

  SQLInsertInto();
  SHAREDOBJECT(SQLInsertInto) ;

  void cloneTo(SQLInsertInto_ptr x);

  void addInsertBeforeComment(string_list_ptr comments);

  string_list_ptr getInsertBeforeCommentsDirect();

  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  SQLCommentHint_ptr getHint();

  void setHint(SQLCommentHint_ptr x);

  virtual SQLObject_ptr clone();

  string_ptr getAlias();

  void setAlias(string_ptr alias);

  SQLExprTableSource_ptr getTableSource();

  void setTableSource(SQLExprTableSource_ptr tableSource);

  SQLName_ptr getTableName();

  void setTableName(SQLName_ptr tableName);

  void setTableSource(SQLName_ptr tableName);

  SQLSelect_ptr getQuery();

  void setQuery(SQLSelectQuery_ptr query);

  void setQuery(SQLSelect_ptr query);

  SQLExpr_list_ptr getColumns();

  void addColumn(SQLExpr_ptr column);

  SQLInsertStatement_ValuesClause_ptr getValues();

  void setValues(SQLInsertStatement_ValuesClause_ptr values);

  SQLInsertStatement_ValuesClause_list_ptr getValuesList();

  void addValueCause(SQLInsertStatement_ValuesClause_ptr valueClause);

  string_ptr getColumnsString();

  long getColumnsStringHash();

  void setColumnsString(string_ptr columnsString, long columnsStringHash);

  BOOL_ptr isOverwrite();

  void setOverwrite(BOOL_ptr overwrite);

  void addPartition(SQLAssignItem_ptr partition);

  SQLAssignItem_list_ptr getPartitions();
};
